
// 数据在内存中存的是补码！！！ 正数原码 补码 反码都相同  负数需要自行计算

// 计算真实值时需要用原码计算

// 数据分为有符号的 (signed)和 无符号的(unsigned)
//  有符号的数据，其二进制序列中，最高位是符号位，其余位为数值位
//  无符号的数据， 其二进制序列中， 所有位都是数值位
//  unsigned char
// 00000000    11111111   char大小为一个字节，八个比特位，所有的二进制序列为00000000   ~   11111111
// 可表示的大小为 -128 ~ 127
// 只写char 等价于 signed char
// unsigned char  0 ~ 255   signed char/char  -128 ~ 127
// 00000000 0
// 11111111 255 1+2+4+8+16+32+64+128  无符号
// 有符号 char
// 00000000  01111111
// 0         127 = 1+2+4+8+16+32+64

// 11111111  10000000  补码
// 10000001  11111111  对应的原码
// -1        -127              另外 10000000 -0 规定为-128

// 11111110 这是补码
// 10000010 这是对应的原码  表示-2

// 00000000  表示 0  (这些都是补码)
// 00000001  表示 1
// 00000010  表示 2
// 00000011  表示 3
//...
// 01111111  表示 127

// 10000000  表示 -128 (11111111   100000000  表示-2^8)
// 10000001  表示 -127
// 10000010  表示 -126
//..
// 11111110  表示 -2
// 11111111  表示 -1    char/signed char   -128 ~ 127

// 无符号char的取值范围  00000000 ~ 11111111 0 ~ （2^8-1)

// short 0000000000000000 1111111111111111 十六个比特位，和char依此类推
// signed short -32768 ~ 32767  unsigned short 0 ~ 65535.

#include <stdio.h>
int main()
{
    char a = -1; // 0 ~ 255
    // 10000000000000000000000000000001 原码
    // 11111111111111111111111111111110 反码
    // 11111111111111111111111111111111 补码
    // char类型只能容纳八个比特位，则从将补码 右向左截断 8 个比特位存入内存中
    // 11111111   内存中的值  而%d是要打印有符号的整形  则进行整形提升
    // 11111111111111111111111111111111 剩下的高位补符号位 得到整形提升后的补码
    // 10000000000000000000000000000000 整形提升后的反码
    // 10000000000000000000000000000001 整形提升后的原码，计算出来为-1
    signed char b = -1; // 0 ~255   255 同上
    unsigned char c = -1;
    // 10000000000000000000000000000001 -1的原码
    // 11111111111111111111111111111111 -1的补码
    // 11111111(截断)  截断是数据在存的时候，存不下，而发生的   当使用的时候达不到整形大小，才发生整形提升
    // 由于c是无符号类型，则进行整形提升时不认为最高位是符号位，全部补0
    // 00000000000000000000000011111111 整形提升后的补码(即内存中的补码)
    // 然后要打印%d 是有符号数，0为整数，则打印255
    printf("a= %d, b = %d, c = %d", a, b, c); // a=-1  b=-1 c= 255
    return 0;
}